#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main0()
{
    char *s = malloc(10);//在堆中分配了10个字节的内存空间
    //一个栈里面的自动指针变量指向了一个堆地址内存空间
    strcpy(s, "abcd");
    printf("%s\n", s);
    free(s);//释放堆中的内存

    s = malloc(100);//因为s是自动变量，可以重新使用，这时候又指向了一个新的堆空间
    strcpy(s, "abcd");
    printf("%s\n", s);
    free(s);//并不是把变量s释放了，而是释放了s指向的那块空间

   // int a[100000000];//堆空间溢出
   // a[99999999999] = 0;//堆空间溢出

    int *p = malloc(10000000 * sizeof(int));
    p[9999999] = 0;
    free(p);
    return 0;
}

int main()
{
    int i;
    scanf("%d", &i);
    int *p = malloc(i * sizeof(int));
    int a;
    for(a = 0; a < i; a++)
    {
        printf("%d\n", p[a]);
    }
    free(p);
    return 0;
}
//用malloc在堆中分配的空间不会自动释放，需要手动释放
//堆和栈的使用时间？
//一个程序的栈大小是有限的，如果一个数组特别大，会导致栈溢出
//如果使用一个特别大的数组，那么需要把数组放入堆，而不是栈
//如果一个数组定义的时候，大小不能 确定，那么就适合用堆，而不是栈
